package com.tedu.api.list;

import org.junit.Test;
/**
 * 导入包问题：同一包下的类需要导入
 *          import java.util.ArrayList;
 *          import java.util.List;
 *通配符   *   匹配当前包【文件夹】下所有类
 *     import java.util.*;
 */

import java.util.*;
/**
 * List集合
 * Collection顶级集合接口【容器】---List集合【子接口】
 * List集合存储数据：存储有序并且重复的元素
 * List集合---接口---无法创建对象
 * 实现类：
 * ArrayList：【常用：List与ArrayList的方法完全一致】数组实现
 * LinkedList：双向链接实现
 * Vector：jdk1.0版本：性能：增删效率慢，线程安全！--ArrayList
 * 重点：掌握List接口集合中所有方法
 */
public class ListAPI {
    /**
     * get(int index)   返回值：E---理解：Object
     * 作用：获取给定下标处的元素，从0开始
     */
    @Test
    public void testGet(){
        //List集合---多态创建集合
        List<String> list=new ArrayList<>();
        //Collection 提供add方法 | List 提供add方法 【重写】
        list.add("你的名字");
        list.add("天气之子");
        list.add("铃芽之旅");
        System.out.println("List集合"+list);
        //获取到：List集合中元素叫：你的名字
        String str=list.get(1);
        System.out.println("获取集合中："+str);
        //需求：获取List集合中所有元素 ---普通for
        for(int i=0;i<list.size();i++){//针对集合，遍历下标：从0开始
            str=list.get(i);
            System.out.println("遍历List集合"+str);
        }
    }
    /**
     * set(int index, E e)  返回值：E
     * 作用：将给定元素设置到指定的下标位置
     */
    @Test
    public void testSet(){
        List<String> list=new ArrayList<>();
        //Collection 提供add方法 | List 提供add方法 【重写】
        list.add("你的名字");
        list.add("天气之子");
        list.add("铃芽之旅");
        //需求：List集合中元素"天气之子"修改成"749局"
        list.set(1,"749局");
        System.out.println("修改后List集合"+list);
    }
    /**
     * List继承Collection[重载:拓展功能]
     * add(int index,E e)   返回值：void     E代表泛型
     * 作用：将给定元素插入到指定位置
     * remove(int index)    返回值：E
     * 作用：将给定位置的元素从集合中删除
     * 查询快，增删慢，选择List/ArrayList
     */
    @Test
    public void testAR(){
        //创建List集合----重写方法add()|重载方法add(下标,"元素")
        List<String> list=new ArrayList<>();
        list.add("秦始皇");list.add("汉武帝");list.add("王安石");list.add("阿道夫.希特勒");
        System.out.println("List集合元素："+list);
        list.add(3,"约瑟夫·维萨里奥诺维奇·斯大林");
        System.out.println("插入后的List集合元素："+list);
        list.remove(4);
        System.out.println("删除后的List集合元素："+list);
    }
    /**
     * List集合
     * subList(int start,int end) 返回值：List<E>
     * 作用：截取范围内的子集，  口诀：含头不含尾
     */
    @Test
    public void testSubList(){
        //创建集合，10个元素：0~9
        List<Integer> list= new ArrayList<>();
        for (int i=0;i<10;i++) {//i 循环针对下标
            list.add(i);
        }
        System.out.println("List集合"+list);
        //获取一个子集：list集合中3~8之间元素
        List<Integer> list1=list.subList(3,9);
        System.out.println("截取的集合"+list1);
        System.out.println("List集合"+list);
        //获取子集：list集合元素中2~6之间元素，子集扩大10倍
        //提示：size()获取子集长度 set()设置每个下标元素
        //   get(下标)获取元素*10
        List<Integer> list2=list.subList(2,7);
        //1.从List集合中，取2~6之前元素
        for (int i=0;i<list2.size();i++){ //i获取下标 0~4
            list2.set(i,list2.get(i)*10);
        //2.for循环遍历子集，遍历同时给每个下标的元素*10

        }
        System.out.println("子集扩大十倍"+list2);
        list2.clear();
        System.out.println("清空子集以后的list"+list);
    }
    /**
     * 需求：清空 list2子集  输出list集合【0,1,7,8,9】
     * 特点：清空clear以及设置set直接对集合做操作
     */
    /**
     * 集合排序
     * Random   伪随机类   包位置：java.util
     * nextInt() 返回值一个伪随机整数【范围：0~数值】
     * Collections 集合工具类   静态方法：sort
     * sort()方法：针对集合元素是数值进行排序【默认升序】！返回值：List
     * 需求：随机生成10个元素【整数：100以内】的集合---对集合排序
     */
    @Test
    public void testArrayList(){
        //创建List集合<整数>
        List<Integer> list=new ArrayList<>();
        //创建伪随机数
        Random r=new Random();
        for (int i=0;i<10;i++) {//10个元素
            list.add(r.nextInt(100));//100以内的随机数
        }
        System.out.println("没有排序的集合"+list);
        //对list集合元素进行排序  Collection.sort(集合)
    Collections.sort(list);
        System.out.println("排序后的集合"+list);
    }
    /**
     * 需求：创建集合，存汉字，排序--能排【没规则】
     * sort(集合，Comparator)   重载功能：拓展排序的功能
     * 集合：排序集合
     * Comparator比较器：指定规则--【定规则：按照字符串长短排序】
     * 重写：compare()--定义比较规则，默认自带交换
     */
    @Test
    public void testComparator(){
        //创建集合--存汉字
        List<String> list=new ArrayList<>();
        list.add("我上早八！");
        list.add("我吃柠檬");
        list.add("我去年买了个表");
        //比较器规则定义：按照字符串长短进行排序
        //Comparator比较器接口--创建1次对象--采用匿名内部类
        Comparator<String> com=new Comparator<String>() {
            //compare方法：针对集合【自定义】排序
            //参数1:泛型：Object o1 集合中第一【交换】个元素
            //参数2:泛型：Object o2 集合中第二【交换】个元素
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
                /**
                 * 返回值  大于 0  4-2交换
                 * 返回值  等于 0  3-4不交换
                 * 返回值  小于 0  2-2不变
                 */
            }
        };
        Collections.sort(list,com);
        System.out.println("排序后的集合" + list);
    }
}
